home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / lib / python2.5 / socket.py < prev    next >
Text File  |  2008-10-05  |  16KB  |  459 lines

  1. # Wrapper module for _socket, providing some additional facilities
  2. # implemented in Python.
  3.  
  4. """\
  5. This module provides socket operations and some related functions.
  6. On Unix, it supports IP (Internet Protocol) and Unix domain sockets.
  7. On other systems, it only supports IP. Functions specific for a
  8. socket are available as methods of the socket object.
  9.  
  10. Functions:
  11.  
  12. socket() -- create a new socket object
  13. socketpair() -- create a pair of new socket objects [*]
  14. fromfd() -- create a socket object from an open file descriptor [*]
  15. gethostname() -- return the current hostname
  16. gethostbyname() -- map a hostname to its IP number
  17. gethostbyaddr() -- map an IP number or hostname to DNS info
  18. getservbyname() -- map a service name and a protocol name to a port number
  19. getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number
  20. ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order
  21. htons(), htonl() -- convert 16, 32 bit int from host to network byte order
  22. inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format
  23. inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)
  24. ssl() -- secure socket layer support (only available if configured)
  25. socket.getdefaulttimeout() -- get the default timeout value
  26. socket.setdefaulttimeout() -- set the default timeout value
  27.  
  28.  [*] not available on all platforms!
  29.  
  30. Special objects:
  31.  
  32. SocketType -- type object for socket objects
  33. error -- exception raised for I/O errors
  34. has_ipv6 -- boolean value indicating if IPv6 is supported
  35.  
  36. Integer constants:
  37.  
  38. AF_INET, AF_UNIX -- socket domains (first argument to socket() call)
  39. SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)
  40.  
  41. Many other constants may be defined; these may be used in calls to
  42. the setsockopt() and getsockopt() methods.
  43. """
  44.  
  45. import _socket
  46. from _socket import *
  47.  
  48. _have_ssl = False
  49. try:
  50.     import _ssl
  51.     from _ssl import *
  52.     _have_ssl = True
  53. except ImportError:
  54.     pass
  55.  
  56. import os, sys
  57.  
  58. try:
  59.     from cStringIO import StringIO
  60. except ImportError:
  61.     from StringIO import StringIO
  62.  
  63. try:
  64.     from errno import EBADF
  65. except ImportError:
  66.     EBADF = 9
  67.  
  68. __all__ = ["getfqdn"]
  69. __all__.extend(os._get_exports_list(_socket))
  70. if _have_ssl:
  71.     __all__.extend(os._get_exports_list(_ssl))
  72.  
  73. _realsocket = socket
  74. if _have_ssl:
  75.     _realssl = ssl
  76.     def ssl(sock, keyfile=None, certfile=None):
  77.         if hasattr(sock, "_sock"):
  78.             sock = sock._sock
  79.         return _realssl(sock, keyfile, certfile)
  80.  
  81. # WSA error codes
  82. if sys.platform.lower().startswith("win"):
  83.     errorTab = {}
  84.     errorTab[10004] = "The operation was interrupted."
  85.     errorTab[10009] = "A bad file handle was passed."
  86.     errorTab[10013] = "Permission denied."
  87.     errorTab[10014] = "A fault occurred on the network??" # WSAEFAULT
  88.     errorTab[10022] = "An invalid operation was attempted."
  89.     errorTab[10035] = "The socket operation would block"
  90.     errorTab[10036] = "A blocking operation is already in progress."
  91.     errorTab[10048] = "The network address is in use."
  92.     errorTab[10054] = "The connection has been reset."
  93.     errorTab[10058] = "The network has been shut down."
  94.     errorTab[10060] = "The operation timed out."
  95.     errorTab[10061] = "Connection refused."
  96.     errorTab[10063] = "The name is too long."
  97.     errorTab[10064] = "The host is down."
  98.     errorTab[10065] = "The host is unreachable."
  99.     __all__.append("errorTab")
  100.  
  101.  
  102.  
  103. def getfqdn(name=''):
  104.     """Get fully qualified domain name from name.
  105.  
  106.     An empty argument is interpreted as meaning the local host.
  107.  
  108.     First the hostname returned by gethostbyaddr() is checked, then
  109.     possibly existing aliases. In case no FQDN is available, hostname
  110.     from gethostname() is returned.
  111.     """
  112.     name = name.strip()
  113.     if not name or name == '0.0.0.0':
  114.         name = gethostname()
  115.     try:
  116.         hostname, aliases, ipaddrs = gethostbyaddr(name)
  117.     except error:
  118.         pass
  119.     else:
  120.         aliases.insert(0, hostname)
  121.         for name in aliases:
  122.             if '.' in name:
  123.                 break
  124.         else:
  125.             name = hostname
  126.     return name
  127.  
  128.  
  129. _socketmethods = (
  130.     'bind', 'connect', 'connect_ex', 'fileno', 'listen',
  131.     'getpeername', 'getsockname', 'getsockopt', 'setsockopt',
  132.     'sendall', 'setblocking',
  133.     'settimeout', 'gettimeout', 'shutdown')
  134.  
  135. if sys.platform == "riscos":
  136.     _socketmethods = _socketmethods + ('sleeptaskw',)
  137.  
  138. # All the method names that must be delegated to either the real socket
  139. # object or the _closedsocket object.
  140. _delegate_methods = ("recv", "recvfrom", "recv_into", "recvfrom_into",
  141.                      "send", "sendto")
  142.  
  143. class _closedsocket(object):
  144.     __slots__ = []
  145.     def _dummy(*args):
  146.         raise error(EBADF, 'Bad file descriptor')
  147.     # All _delegate_methods must also be initialized here.
  148.     send = recv = recv_into = sendto = recvfrom = recvfrom_into = _dummy
  149.     __getattr__ = _dummy
  150.  
  151. class _socketobject(object):
  152.  
  153.     __doc__ = _realsocket.__doc__
  154.  
  155.     __slots__ = ["_sock", "__weakref__"] + list(_delegate_methods)
  156.  
  157.     def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, _sock=None):
  158.         if _sock is None:
  159.             _sock = _realsocket(family, type, proto)
  160.         self._sock = _sock
  161.         for method in _delegate_methods:
  162.             setattr(self, method, getattr(_sock, method))
  163.  
  164.     def close(self):
  165.         self._sock = _closedsocket()
  166.         dummy = self._sock._dummy
  167.         for method in _delegate_methods:
  168.             setattr(self, method, dummy)
  169.     close.__doc__ = _realsocket.close.__doc__
  170.  
  171.     def accept(self):
  172.         sock, addr = self._sock.accept()
  173.         return _socketobject(_sock=sock), addr
  174.     accept.__doc__ = _realsocket.accept.__doc__
  175.  
  176.     def dup(self):
  177.         """dup() -> socket object
  178.  
  179.         Return a new socket object connected to the same system resource."""
  180.         return _socketobject(_sock=self._sock)
  181.  
  182.     def makefile(self, mode='r', bufsize=-1):
  183.         """makefile([mode[, bufsize]]) -> file object
  184.  
  185.         Return a regular file object corresponding to the socket.  The mode
  186.         and bufsize arguments are as for the built-in open() function."""
  187.         return _fileobject(self._sock, mode, bufsize)
  188.  
  189.     family = property(lambda self: self._sock.family, doc="the socket family")
  190.     type = property(lambda self: self._sock.type, doc="the socket type")
  191.     proto = property(lambda self: self._sock.proto, doc="the socket protocol")
  192.  
  193.     _s = ("def %s(self, *args): return self._sock.%s(*args)\n\n"
  194.           "%s.__doc__ = _realsocket.%s.__doc__\n")
  195.     for _m in _socketmethods:
  196.         exec _s % (_m, _m, _m, _m)
  197.     del _m, _s
  198.  
  199. socket = SocketType = _socketobject
  200.  
  201. class _fileobject(object):
  202.     """Faux file object attached to a socket object."""
  203.  
  204.     default_bufsize = 8192
  205.     name = "<socket>"
  206.  
  207.     __slots__ = ["mode", "bufsize", "softspace",
  208.                  # "closed" is a property, see below
  209.                  "_sock", "_rbufsize", "_wbufsize", "_rbuf", "_wbuf",
  210.                  "_close"]
  211.  
  212.     def __init__(self, sock, mode='rb', bufsize=-1, close=False):
  213.         self._sock = sock
  214.         self.mode = mode # Not actually used in this version
  215.         if bufsize < 0:
  216.             bufsize = self.default_bufsize
  217.         self.bufsize = bufsize
  218.         self.softspace = False
  219.         # _rbufsize is the suggested recv buffer size.  It is *strictly*
  220.         # obeyed within readline() for recv calls.  If it is larger than
  221.         # default_bufsize it will be used for recv calls within read().
  222.         if bufsize == 0:
  223.             self._rbufsize = 1
  224.         elif bufsize == 1:
  225.             self._rbufsize = self.default_bufsize
  226.         else:
  227.             self._rbufsize = bufsize
  228.         self._wbufsize = bufsize
  229.         # We use StringIO for the read buffer to avoid holding a list
  230.         # of variously sized string objects which have been known to
  231.         # fragment the heap due to how they are malloc()ed and often
  232.         # realloc()ed down much smaller than their original allocation.
  233.         self._rbuf = StringIO()
  234.         self._wbuf = [] # A list of strings
  235.         self._close = close
  236.  
  237.     def _getclosed(self):
  238.         return self._sock is None
  239.     closed = property(_getclosed, doc="True if the file is closed")
  240.  
  241.     def close(self):
  242.         try:
  243.             if self._sock:
  244.                 self.flush()
  245.         finally:
  246.             if self._close:
  247.                 self._sock.close()
  248.             self._sock = None
  249.  
  250.     def __del__(self):
  251.         try:
  252.             self.close()
  253.         except:
  254.             # close() may fail if __init__ didn't complete
  255.             pass
  256.  
  257.     def flush(self):
  258.         if self._wbuf:
  259.             buffer = "".join(self._wbuf)
  260.             self._wbuf = []
  261.             self._sock.sendall(buffer)
  262.  
  263.     def fileno(self):
  264.         return self._sock.fileno()
  265.  
  266.     def write(self, data):
  267.         data = str(data) # XXX Should really reject non-string non-buffers
  268.         if not data:
  269.             return
  270.         self._wbuf.append(data)
  271.         if (self._wbufsize == 0 or
  272.             self._wbufsize == 1 and '\n' in data or
  273.             self._get_wbuf_len() >= self._wbufsize):
  274.             self.flush()
  275.  
  276.     def writelines(self, list):
  277.         # XXX We could do better here for very long lists
  278.         # XXX Should really reject non-string non-buffers
  279.         self._wbuf.extend(filter(None, map(str, list)))
  280.         if (self._wbufsize <= 1 or
  281.             self._get_wbuf_len() >= self._wbufsize):
  282.             self.flush()
  283.  
  284.     def _get_wbuf_len(self):
  285.         buf_len = 0
  286.         for x in self._wbuf:
  287.             buf_len += len(x)
  288.         return buf_len
  289.  
  290.     def read(self, size=-1):
  291.         # Use max, disallow tiny reads in a loop as they are very inefficient.
  292.         # We never leave read() with any leftover data from a new recv() call
  293.         # in our internal buffer.
  294.         rbufsize = max(self._rbufsize, self.default_bufsize)
  295.         # Our use of StringIO rather than lists of string objects returned by
  296.         # recv() minimizes memory usage and fragmentation that occurs when
  297.         # rbufsize is large compared to the typical return value of recv().
  298.         buf = self._rbuf
  299.         buf.seek(0, 2)  # seek end
  300.         if size < 0:
  301.             # Read until EOF
  302.             self._rbuf = StringIO()  # reset _rbuf.  we consume it via buf.
  303.             while True:
  304.                 data = self._sock.recv(rbufsize)
  305.                 if not data:
  306.                     break
  307.                 buf.write(data)
  308.             return buf.getvalue()
  309.         else:
  310.             # Read until size bytes or EOF seen, whichever comes first
  311.             buf_len = buf.tell()
  312.             if buf_len >= size:
  313.                 # Already have size bytes in our buffer?  Extract and return.
  314.                 buf.seek(0)
  315.                 rv = buf.read(size)
  316.                 self._rbuf = StringIO()
  317.                 self._rbuf.write(buf.read())
  318.                 return rv
  319.  
  320.             self._rbuf = StringIO()  # reset _rbuf.  we consume it via buf.
  321.             while True:
  322.                 left = size - buf_len
  323.                 # recv() will malloc the amount of memory given as its
  324.                 # parameter even though it often returns much less data
  325.                 # than that.  The returned data string is short lived
  326.                 # as we copy it into a StringIO and free it.  This avoids
  327.                 # fragmentation issues on many platforms.
  328.                 data = self._sock.recv(left)
  329.                 if not data:
  330.                     break
  331.                 n = len(data)
  332.                 if n == size and not buf_len:
  333.                     # Shortcut.  Avoid buffer data copies when:
  334.                     # - We have no data in our buffer.
  335.                     # AND
  336.                     # - Our call to recv returned exactly the
  337.                     #   number of bytes we were asked to read.
  338.                     return data
  339.                 if n == left:
  340.                     buf.write(data)
  341.                     del data  # explicit free
  342.                     break
  343.                 assert n <= left, "recv(%d) returned %d bytes" % (left, n)
  344.                 buf.write(data)
  345.                 buf_len += n
  346.                 del data  # explicit free
  347.                 #assert buf_len == buf.tell()
  348.             return buf.getvalue()
  349.  
  350.     def readline(self, size=-1):
  351.         buf = self._rbuf
  352.         buf.seek(0, 2)  # seek end
  353.         if buf.tell() > 0:
  354.             # check if we already have it in our buffer
  355.             buf.seek(0)
  356.             bline = buf.readline(size)
  357.             if bline.endswith('\n') or len(bline) == size:
  358.                 self._rbuf = StringIO()
  359.                 self._rbuf.write(buf.read())
  360.                 return bline
  361.             del bline
  362.         if size < 0:
  363.             # Read until \n or EOF, whichever comes first
  364.             if self._rbufsize <= 1:
  365.                 # Speed up unbuffered case
  366.                 buf.seek(0)
  367.                 buffers = [buf.read()]
  368.                 self._rbuf = StringIO()  # reset _rbuf.  we consume it via buf.
  369.                 data = None
  370.                 recv = self._sock.recv
  371.                 while data != "\n":
  372.                     data = recv(1)
  373.                     if not data:
  374.                         break
  375.                     buffers.append(data)
  376.                 return "".join(buffers)
  377.  
  378.             buf.seek(0, 2)  # seek end
  379.             self._rbuf = StringIO()  # reset _rbuf.  we consume it via buf.
  380.             while True:
  381.                 data = self._sock.recv(self._rbufsize)
  382.                 if not data:
  383.                     break
  384.                 nl = data.find('\n')
  385.                 if nl >= 0:
  386.                     nl += 1
  387.                     buf.write(buffer(data, 0, nl))
  388.                     self._rbuf.write(buffer(data, nl))
  389.                     del data
  390.                     break
  391.                 buf.write(data)
  392.             return buf.getvalue()
  393.         else:
  394.             # Read until size bytes or \n or EOF seen, whichever comes first
  395.             buf.seek(0, 2)  # seek end
  396.             buf_len = buf.tell()
  397.             if buf_len >= size:
  398.                 buf.seek(0)
  399.                 rv = buf.read(size)
  400.                 self._rbuf = StringIO()
  401.                 self._rbuf.write(buf.read())
  402.                 return rv
  403.             self._rbuf = StringIO()  # reset _rbuf.  we consume it via buf.
  404.             while True:
  405.                 data = self._sock.recv(self._rbufsize)
  406.                 if not data:
  407.                     break
  408.                 left = size - buf_len
  409.                 # did we just receive a newline?
  410.                 nl = data.find('\n', 0, left)
  411.                 if nl >= 0:
  412.                     nl += 1
  413.                     # save the excess data to _rbuf
  414.                     self._rbuf.write(buffer(data, nl))
  415.                     if buf_len:
  416.                         buf.write(buffer(data, 0, nl))
  417.                         break
  418.                     else:
  419.                         # Shortcut.  Avoid data copy through buf when returning
  420.                         # a substring of our first recv().
  421.                         return data[:nl]
  422.                 n = len(data)
  423.                 if n == size and not buf_len:
  424.                     # Shortcut.  Avoid data copy through buf when
  425.                     # returning exactly all of our first recv().
  426.                     return data
  427.                 if n >= left:
  428.                     buf.write(buffer(data, 0, left))
  429.                     self._rbuf.write(buffer(data, left))
  430.                     break
  431.                 buf.write(data)
  432.                 buf_len += n
  433.                 #assert buf_len == buf.tell()
  434.             return buf.getvalue()
  435.  
  436.     def readlines(self, sizehint=0):
  437.         total = 0
  438.         list = []
  439.         while True:
  440.             line = self.readline()
  441.             if not line:
  442.                 break
  443.             list.append(line)
  444.             total += len(line)
  445.             if sizehint and total >= sizehint:
  446.                 break
  447.         return list
  448.  
  449.     # Iterator protocols
  450.  
  451.     def __iter__(self):
  452.         return self
  453.  
  454.     def next(self):
  455.         line = self.readline()
  456.         if not line:
  457.             raise StopIteration
  458.         return line
  459.